/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos.superclasses;

import controle.gui.frames.internos.ControleImoveis;
import controle.gui.frames.internos.ControleQuadras;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.gui.utils.EnabledGUIElements;
import gui.frames.FramePrincipal;
import gui.frames.internos.IFBusca;
import gui.frames.internos.IFImoveis;
import gui.frames.internos.IFQuadras;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.*;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Administrador
 */
public class Controle {

    //Variáveis da classe
    Component parentComponent = null;

    public Controle(Component parentComponent) {
        this.parentComponent = parentComponent;
    }

    /**
     * Verifica em
     *
     * @args se existe algum JTextField vazio
     *
     * @param args - Vetor de JTextFields
     * @return TRUE caso exista algum textfield vazio, FALSE caso todos estejam
     * preenchidos
     */
    protected boolean verificaJTextFieldVazios(JTextField... args) {

        for (int index = 0; index < args.length; index++) {
            if (args[index].getText().trim().isEmpty()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Verifica em
     *
     * @args se existe algum JComboBox vazio
     *
     * @param args - Vetor de JComboBox
     * @return TRUE caso exista algum combo não foi selecionado, FALSE caso
     * todos estejam selecionados
     */
    protected boolean verificaJComboBoxVazios(JComboBox... args) {

        for (int index = 0; index < args.length; index++) {
            if (args[index].getSelectedIndex() == 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * Carrega do bd os logradouros relacionados com uma determinada quadra
     *
     * @return
     */
    protected List<String> getListLogradourosPorQuadra(Quadra qua) {

        //Captura a quadra do bd
        qua = (Quadra) AbstractDAO.consultar(
                "from Quadra q left join fetch q.localidade lc left join fetch q.quadralogradouros ql left join fetch ql.logradouro lg left join fetch lg.municipio m where q.idQuadra="
                + qua.getIdQuadra()).get(0);

        List<String> listLog = new ArrayList<String>();

        //Percorre todas as quadralogradouros preenchendo a lista de logradouros delas
        for (Iterator it = qua.getQuadralogradouros().iterator(); it.hasNext();) {
            listLog.add(((Quadralogradouro) it.next()).getLogradouro().getNome());
        }

        Collections.sort(listLog);

        return listLog;

    }

    /**
     * Busca uma lista de municípios no banco de dados a partir do código
     * enviado por parâmetro
     *
     * @param codigo - código do município
     * @param parentComponent - frame
     * @return
     */
    protected List<Municipio> getListMunicipio(String codigo) {

        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigo + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listMun;
    }

    /**
     * Busca uma lista de localidades no banco de dados a partir do código
     * enviado por parâmetro
     *
     * @param codigo - código da localidade
     * @param parentComponent - frame
     * @return
     */
    protected List<Localidade> getListLocalidade(String codigo, Municipio mun) {

        if (codigo == null || codigo.equals("")) {
            return null;
        }

        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "codigo=" + codigo + " AND idMunicipio=" + mun.getIdMunicipio());
        if (listLoc.isEmpty()) {
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhuma localidade com este código.", "Localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listLoc;
    }

    /**
     * Busca uma lista de logradouros no banco de dados a partir do id enviado
     * por parâmetro
     *
     * @param id - id do logradouro
     * @param consultaSemFecharSessao - Realiza uma consulta cuja sessão
     * continua aberta, porém deve ser fechada depois
     * @return
     */
    protected List<Logradouro> getListLogradouro(String id) {
        return getListLogradouro(id, false);
    }

    protected List<Logradouro> getListLogradouro(String id, boolean consultaSemFecharSessao) {

        List<Logradouro> listLog = null;

        if (consultaSemFecharSessao) {
            listLog = AbstractDAO.consultarSemFecharSessao("Logradouro", "idLogradouro=" + id);
        } else {
            listLog = AbstractDAO.consultar("Logradouro", "idLogradouro=" + id);
        }

        if (listLog == null || listLog.isEmpty()) {
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhum logradouro com este código.", "Logradouro inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listLog;
    }

    /**
     * Busca uma lista de agentes no banco de dados a partir do nome enviado por
     * parâmetro
     *
     * @return
     */
    protected List<Agente> getListAgente(String nome) {

        List<Agente> listAge = AbstractDAO.consultar("Agente", "nome='" + nome + "'");
        if (listAge.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Não existe nenhum agente com este nome.", "Agente inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listAge;
    }

    /**
     * Busca uma lista de agentes no banco de dados a partir do nome enviado por
     * parâmetro
     *
     * @return
     */
    protected List<Agente> getListAgente(Integer codigo, String nome) {

        List<Agente> listAge = AbstractDAO.consultar("Agente", "nome='" + nome + "' AND codigo=" + codigo);
        if (listAge.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Não existe nenhum agente com este nome e código.", "Agente inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listAge;
    }

    /**
     * Evento de textBuscaCodigoMunicipio
     *
     * @return
     */
    public boolean eventoTextCodigoMunicipio(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio, JTextField textNomeMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            EnabledGUIElements.enabledJComponent(textCodigoLocalidade, comboLocalidade);
            if (comboLocalidade != null) {
                comboLocalidade.setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...", "Localidade where idMunicipio=" + list.get(0).getIdMunicipio(), "nome"));
            }

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textCodigoLocalidade, textNomeMunicipio);
            new ApagaElementosDaInterface().apagaJComboBox(comboLocalidade);
            EnabledGUIElements.disabledJComponent(textCodigoLocalidade, comboLocalidade);
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            return false;
        }

        return true;
    }

    public Municipio eventoTextCodigoMunicipio(JTextField textCodigoLocalidade, JTextField textNomeLocalidade, JButton buttonSelecionarLocalidade,
            JTextField textCodigoMunicipio, JTextField textNomeMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            EnabledGUIElements.enabledJComponent(textCodigoLocalidade, buttonSelecionarLocalidade);

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textCodigoLocalidade, textNomeLocalidade, textNomeMunicipio);
            EnabledGUIElements.disabledJComponent(textCodigoLocalidade, buttonSelecionarLocalidade);
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return list.get(0);
    }

    /**
     * Evento de textBuscaCodigoLocalidade
     *
     * @return
     */
    public static boolean eventoTextCodigoLocalidade(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio,
            JComboBox comboQuadra) {

        String codigoMun = textCodigoMunicipio.getText().trim();
        String codigoLoc = textCodigoLocalidade.getText().trim();

        //Verifica se o município existe
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        List<Localidade> list = AbstractDAO.consultar("Localidade", "codigo='" + codigoLoc + "' AND idMunicipio=" + listMun.get(0).getIdMunicipio());
        if (list.size() > 0) {
            comboLocalidade.setSelectedItem(list.get(0).getNome());

            //Carrega o combo de Quadras
            if (comboQuadra != null) {
                comboQuadra.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", "codigo", "Quadra where idLocalidade=" + list.get(0).getIdLocalidade(), "codigo"));
                comboQuadra.setEnabled(true);
            }

        } else {
            JOptionPane.showMessageDialog(null, "Não existe nenhuma localidade para este município com este código.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            if (comboQuadra != null) {
                comboQuadra.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Selecione..."}));
            }

            return false;
        }
        return true;
    }

    public static boolean eventoTextCodigoLocalidade(JTextField textCodigoLocalidade, JTextField textNomeLocalidade, JTextField textCodigoMunicipio,
            JComboBox comboQuadra, JButton buttonSelecionarLogradouro, JTextField textIdLogradouro, JTextField textNomeLogradouro) {

        String codigoMun = textCodigoMunicipio.getText().trim();
        String codigoLoc = textCodigoLocalidade.getText().trim();

        //Verifica se o município existe
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (listMun.isEmpty()) {
            textCodigoLocalidade.setEnabled(false);
            if (buttonSelecionarLogradouro != null && textIdLogradouro != null && textNomeLogradouro != null) {
                EnabledGUIElements.disabledJComponent(buttonSelecionarLogradouro);
                new ApagaElementosDaInterface().apagaJTextField(textIdLogradouro, textNomeLogradouro);
            }
            textCodigoLocalidade.setText("");
            JOptionPane.showMessageDialog(null, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            return false;
        }

        List<Localidade> list = AbstractDAO.consultar("Localidade", "codigo='" + codigoLoc + "' AND idMunicipio=" + listMun.get(0).getIdMunicipio());
        if (list.size() > 0) {
            textNomeLocalidade.setText(list.get(0).getNome());
            if (buttonSelecionarLogradouro != null && textIdLogradouro != null && textNomeLogradouro != null) {
                EnabledGUIElements.enabledJComponent(buttonSelecionarLogradouro);

            }

            //Carrega o combo de Quadras
            if (comboQuadra != null) {
                comboQuadra.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", "codigo", "Quadra where idLocalidade=" + list.get(0).getIdLocalidade(), "codigo"));
                comboQuadra.setEnabled(true);
            }

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textNomeLocalidade);
            if (buttonSelecionarLogradouro != null && textIdLogradouro != null && textNomeLogradouro != null) {
                EnabledGUIElements.disabledJComponent(buttonSelecionarLogradouro);
                new ApagaElementosDaInterface().apagaJTextField(textIdLogradouro, textNomeLogradouro);
            }
            JOptionPane.showMessageDialog(null, "Não existe nenhuma localidade para este município com este código.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            if (comboQuadra != null) {
                comboQuadra.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Selecione..."}));
            }

            return false;
        }
        return true;
    }

    /**
     * Evento de comboLocalidade
     *
     * @return
     */
    public boolean eventoComboLocalidade(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio, JButton buttonSelecionarLogradouro,
            JComboBox comboQuadra, JTextField textImovelNumero) {

        //Preenche o código da localidade a partir do combobox de nomes 
        String codigoMun = textCodigoMunicipio.getText().trim();

        List<Municipio> listMunicipio = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (!codigoMun.isEmpty()) {
            if (listMunicipio.isEmpty()) {
                return false;
            }
        } else {
            return false;
        }

        String nomeLoc = comboLocalidade.getSelectedItem().toString();
        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "nome='" + nomeLoc + "' AND idMunicipio=" + listMunicipio.get(0).getIdMunicipio());
        if (listLoc.size() > 0) {
            textCodigoLocalidade.setText(listLoc.get(0).getCodigo().toString());
            if (buttonSelecionarLogradouro != null) {
                EnabledGUIElements.enabledJComponent(buttonSelecionarLogradouro);
            }

            //Carrega o combo de Quadras
            if (comboQuadra != null) {
                comboQuadra.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", "codigo", "Quadra where idLocalidade=" + listLoc.get(0).getIdLocalidade(), "codigo"));
                comboQuadra.setEnabled(true);
            }

            //Carrega o combo de Numero de Imovel
            if (textImovelNumero != null) {
                textImovelNumero.setEnabled(true);

            }

        } else {
            textCodigoLocalidade.setText("");
            if (buttonSelecionarLogradouro != null) {
                EnabledGUIElements.disabledJComponent(buttonSelecionarLogradouro);
            }

        }


        return true;
    }

    /**
     * Abre o frame de busca para selecionar a localidade
     *
     * @return
     */
    public boolean eventoBuscarLocalidade(Object classeControle, Object frameClass, String codMunicipio, boolean isBusca) {

        //Captura as informações da quadra
        if (codMunicipio != null && codMunicipio.length() > 0 && !codMunicipio.equals("")) {

            //Busca o município no bd
            Municipio municipio = getListMunicipio(codMunicipio).get(0);

            if (getListMunicipio(codMunicipio).size() > 0) {

                //Verifica qual é a classe de controle que chamou este método
                IFBusca frameAdd = null;
                if (classeControle instanceof ControleQuadras && frameClass instanceof IFQuadras) {
                    frameAdd = new IFBusca((ControleQuadras) classeControle, Localidade.class, IFQuadras.class, "idMunicipio=" + municipio.getIdMunicipio(), isBusca);

                } else if (classeControle instanceof ControleImoveis) {
                    frameAdd = new IFBusca((ControleImoveis) classeControle, Localidade.class, IFImoveis.class, "idMunicipio=" + municipio.getIdMunicipio(), isBusca);
                }

                //Focaliza o novo JInternalFrame
                if (frameAdd != null) {
                    FramePrincipal.desktopPanel.add(frameAdd);
                    FramePrincipal.desktopPanel.getDesktopManager().activateFrame(frameAdd);
                }

                return true;

            } else {
                JOptionPane.showMessageDialog(null, "Código de município inválido ou inexistente!", "Atenção!",
                        JOptionPane.WARNING_MESSAGE);
                return false;
            }


        } else {
            JOptionPane.showMessageDialog(null, "Defina primeiramente o município!", "Atenção!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }
    }

    protected void setSameText(String str, boolean apagaTextoAtual, JTextField... args) {

        for (int index = 0; index < args.length; index++) {
            if (args[index] != null && str != null) {
                if (apagaTextoAtual || args[index].getText().isEmpty()) {
                    args[index].setText(str);
                }
            }
        }
    }
}
